# Create your views here.
import json
import re

from django.contrib.auth import login

from .models import User
"""

判断用户名是否重复的功能
前端：当用户输入用户名之后失去焦点之后发送一个axios（ajax）请求

后端：
    请求：接受用户名
    业务逻辑：根据用户名去数据库查询看有没有该数据
    响应：{code:0,count:0/1,errmsg:ok}
    '/usernames/<username>/count/';

"""

from django.views import View
from django.http import JsonResponse

class UsernameCountView(View):
    def get(self,request,username):
        count=User.objects.filter(username=username).count()
        return JsonResponse({'code':0,'count':count,'errmsg':'ok'})

class RegisterView(View):
    """用户注册"""
    def post(self,request):
        # 接收参数：post json
        body_byte = request.body
        body_str = body_byte.decode()
        body_dist = json.loads(body_str)
        #获取数据
        username = body_dist.get('username')
        password = body_dist.get('password')
        password2 = body_dist.get('password2')
        mobile = body_dist.get('mobile')
        allow = body_dist.get('allow')

        # 校验参数：前后端的校验需要分开，避免恶意用户越过前端逻辑发请求，要保证后端的安全，前后端的校验逻辑相同
        # 判断参数是否齐全:all([列表])：会去校验列表中的元素是否为空或者为false，只要有一个为空或false，返回false
        if not all([username,password,password2,mobile,allow]):
            return JsonResponse({'code':400,'errmsg':'参数不全'})
        # 判断用户名是否是5-20个字符
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$',username):
            return JsonResponse({'code': 400, 'errmsg': '用户名不符合规则'})
        # 判断密码是否是8-20个数字

        # 判断两次密码是否一致

        # 判断手机号是否合法

        # 判断短信验证码是否输入正确

        # 判断是否勾选用户协议

        # 保存注册数据：是注册业务的核心
        # return render(request, 'register.html', {'register_errmsg': '注册失败'})
        # user = User(username=username,password=password,mobile=mobile)
        # user.save()
        user = User.objects.create_user(username=username,password=password,mobile=mobile)
        user.save()
        # 实现状态保持
        login(request,user)
        # 响应结果:重定向到首页

        # 为了实现在首页的右上角展示用户名信息，我们需要将用户名缓存到cookie中
        # response.set_cookie('key', 'val', 'expiry')

        # 响应结果:重定向到首页
        return JsonResponse({'code':0,'errmsg':'ok'})



# 如果需求是注册成功后即表示用户登入成功，那么此时可以在注册成功后实现状态保持
# 如果需求是注册成功后不表示用户登入成功，那么此时不用在注册成功后实现状态保持